package org.example.jwt;

import io.jsonwebtoken.*;

import java.util.Date;

/**
 * {@code @BelongsProject:}xkLab
 * {@code @BelongsPackage:}org.example.jwt
 * {@code @Author:} Xukai
 * {@code @CreateTime:}2025-03-24  23:45
 * {@code @Description:Jwt生成逻辑}
 * {@code @Version:}1.0
 */
public class Jwt {
    //密钥(十分重要！只有服务器存储，用户端不可获取)
    private static final String SECRET_KEY = "yufvlgiugiugiugbigigiglvgyuvlyuvyuhvuvgliuv";
    //有效时间(自定义)
    private static final long EXPIRATION_TIME = 86400000; // 1 day in milliseconds
    //生成token
    public static String generateToken(String username) {
        JwtBuilder builder = Jwts.builder();        //创建构造器

        //前三个为设置负载信息，具体信息可以可见该方法之下的注释。最后一个signWith是Header签名算法与服务器端密钥
        return builder.setSubject(username)         //用户名
                .setIssuedAt(new Date())            //签发时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))  //即过期时间
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)                        //签名算法和密钥
                .compact();     //合成token(Header + Payload + Signature)
    }
//    载荷（Payload）：Payload包含了要传输的信息。载荷可以包含各种声明（claims），以键值对的形式存在。
//    以下是官方规定的七个使用字段，您也可以自定义私有字段
//    iss (issuer)：签发人
//    exp (expiration time)：过期时间
//    sub (subject)：主题
//    aud (audience)：受众
//    nbf (Not Before)：生效时间
//    iat (Issued At)：签发时间
//    jti (JWT ID)：编号


    //验证Token
    public static Claims validateToken(String token){
        return Jwts.parser()                //创建解析器
                .setSigningKey(SECRET_KEY)  //设置密钥
                .parseClaimsJws(token)      //解析token
                .getBody();                 //获取负载
    }

}
